perm filename GENLIS[DEN,LMM] blob sn#070831 filedate 1973-11-07 generic text, type T, neo UTF8
(FILECREATED " 7-NOV-73  5:24:38" S-GENLISP)


  (LISPXPRINT (QUOTE GENLISPVARS)
              T)
  (RPAQQ GENLISPVARS
         ((* VERY GENERAL PURPOSE ROUTINES
             (BUT NOT SYSTEM INTERFACE ROUTINES; I.E. DON'T DEPEND ON 
                  VAGARIES OF LISP FILE PACKAGE, FOR EXAMPLE))
          (FNS GROUPRADS GROUPRADS1 CIELING GROUPBY CARLIST CDRLIST 
               LCARLIST LCDRLIST DELETE DIFF ORDPAIR MAX MIN ORDERED 
               SUMOF LMASSOC INTERSECTP ?=)
          (BLOCKS (GROUPRADBLOCK GROUPRADS GROUPRADS1 (ENTRIES 
                                                        GROUPRADS))
                  (NIL CIELING GROUPBY CARLIST CDRLIST LCARLIST 
                       LCDRLIST DELETE DIFF ORDPAIR MAX MIN ORDERED 
                       SUMOF LMASSOC INTERSECTP ?= (LINKFNS . T)))
          (USERMACROS ?=)))

(* VERY GENERAL PURPOSE ROUTINES (BUT NOT SYSTEM INTERFACE ROUTINES;
I.E. DON'T DEPEND ON VAGARIES OF LISP FILE PACKAGE, FOR EXAMPLE))

(DEFINEQ

(GROUPRADS
  [LAMBDA (CLOFLISTS)

          (* Takes a composition list of lists and returns 
          all the list of all possible selections;
          with one from each list; for example given 
          (((A B C) . 2) ((E F) . 3)) returns 
          (A A E E E) (A A E E F) (A A E F E) ...
          I.e. All lists with 2 elements from 
          (A B C) and three from (E F) 
          (duplication allowed))


    (COND
      ((NULL CLOFLISTS)
        (LIST NIL))
      (T (GROUPRADS1 (CAAR CLOFLISTS)
                     (CDAR CLOFLISTS)
                     (GROUPRADS (CDR CLOFLISTS])

(GROUPRADS1
  [LAMBDA (TAKELIST N LISTSDONE)
    (COND
      ((ZEROP N)
        LISTSDONE)
      (T (FOR OLD TAKELIST ON TAKELIST FOR RADS
            IN (GROUPRADS1 TAKELIST (SUB1 N)
                           LISTSDONE)
            COLLECT (CONS (CAR TAKELIST)
                          RADS])

(CIELING
  [LAMBDA (X)
    (FIX (PLUS X .99])

(GROUPBY
  [LAMBDA (FN L)

          (* FN is a function of one argument;
          L is a list; returns L grouped by the values of FN 
          applied to it; e.g. (GROUPBY 'VALENCE L) will 
          return ((2 %. Atoms with VALENCE 2) 
          (3 %. Atoms with VALENCE 3) ...))


    (COND
      ((NULL L)
        NIL)
      (T (PROG (FNX GROUPCDR X)
               (SETQ GROUPCDR (GROUPBY FN (CDR L)))
               (COND
                 ((NULL (SETQ X (LMASSOC (SETQ FNX
                                           (APPLY* FN (CAR L)))
                                         GROUPCDR NIL)))
                   (RETURN (CONS (LIST FNX (CAR L))
                                 GROUPCDR)))
                 (T (NCONC1 X (CAR L))
                    (RETURN GROUPCDR])

(CARLIST
  [LAMBDA (L)
    (for X in L collect (CAR X])

(CDRLIST
  [LAMBDA (L)
    (for X in L collect (CDR X])

(LCARLIST
  [LAMBDA (L)
    (for X in L collect (CARLIST X])

(LCDRLIST
  [LAMBDA (L)
    (for X in L collect (CDRLIST X])

(DELETE
  [LAMBDA (I L)
    (COND
      [(NULL L)
        (HELP (QUOTE (BAD ARG TO DELETE]
      ((EQ (CAR L)
           I)
        (CDR L))
      (T (RPLACD L (DELETE I (CDR L])

(DIFF
  [LAMBDA (L1 L2)
    (FOR X IN L1 WHEN (NOT (MEMBER X L2)) COLLECT X])

(ORDPAIR
  [LAMBDA (X1 X2)
    (COND
      ((ORDERED X1 X2)
        (CONS X1 X2))
      (T (CONS X2 X1])

(MAX
  [LAMBDA (X Y)
    (COND
      ((IGREATERP X Y)
        X)
      (T Y])

(MIN
  [LAMBDA (X Y)
    (COND
      ((IGREATERP X Y)
        Y)
      (T X])

(ORDERED
  [LAMBDA (X Y)
    (COND
      ((NLISTP X)
        (ALPHORDER X Y))
      ((NLISTP Y)
        NIL)
      ((EQUAL (CAR X)
              (CAR Y))
        (ORDERED (CDR X)
                 (CDR Y)))
      (T (ORDERED (CAR X)
                  (CAR Y])

(SUMOF
  [LAMBDA (L)
    (for X in L sum X])

(LMASSOC
  [LAMBDA (X Y Z)
    (COND
      ([SETQ X (COND
            ((OR (SMALLP X)
                 (LITATOM X))
              (ASSOC X Y))
            (T (SASSOC X Y]
        (CDR X))
      (T Z])

(INTERSECTP
  [LAMBDA (X Y)
    (OR (NULL X)
        (NULL Y)
        (COND
          [(LISTP X)
            (SOME X (FUNCTION (LAMBDA (X)
                      (INTERSECTP X Y]
          [(LISTP Y)
            (SOME Y (FUNCTION (LAMBDA (Y)
                      (INTERSECTP X Y]
          (T (EQ X Y])

(?=
  [LAMBDA (FORM)
    [COND
      ((EQ (CAR FORM)
           (QUOTE STRUCFORM))
        (SETQ FORM (CDR FORM]
    (OR (GETD (CAR FORM))
        (ERROR (CAR FORM)
               "not a function" T))
    (RESETFORM (PRINTLEVEL 3)
               (SELECTQ (ARGTYPE (CAR FORM))
                        [(0 1)
                          (MAPC (ARGLIST (CAR FORM))
                                (FUNCTION (LAMBDA (X)
                                    (PRIN1 X T)
                                    (PRIN1 " = " T)
                                    (PRINT (CAR (SETQ FORM
                                                  (CDR FORM)))
                                           T]
                        (PROGN (PRIN1 (ARGLIST (CAR FORM))
                                      T)
                               (PRIN1 " = " T)
                               (PRINT (CDR FORM)
                                      T])
)
(DECLARE
  (BLOCK: GROUPRADBLOCK GROUPRADS GROUPRADS1 (ENTRIES GROUPRADS))
  (BLOCK: NIL CIELING GROUPBY CARLIST CDRLIST LCARLIST LCDRLIST 
          DELETE DIFF ORDPAIR MAX MIN ORDERED SUMOF LMASSOC 
          INTERSECTP ?= (LINKFNS . T))
) [ADDTOVAR USERMACROS [?= NIL (ORR ((E (?= (##))
                                        T))
                                    ((E (QUOTE ?=?]
            (?= NIL (ORR [(E (MAP2C (ARGLIST (## 1))
                                    (## 2 UP)
                                    (FUNCTION (LAMBDA (X Y)
                                                      (PRIN1 X T)
                                                      (PRIN1 " = " T)
                                                      (PRINT Y T]
                         ((E (QUOTE ?=?]
  (ADDTOVAR EDITCOMSA ?= ?=)
STOP